Análise do Jogo de Imagens aplicadas no Ensino médio

Amostra dos dados da pesquisa realizada

Tabulação do número de acertos dos itens do jogo de imagens.

Coluna Descrição
Exoticas Número de acertos dentre todas as imagens exibidas do tipo exótica, valor experado é 5.
Nativas Número de acertos dentre todas as imagens exibidas do tipo nativa, valor experado é 5.
head(pos_gabarito$dados, 10)

Determinado a taxa de percepção

Entende-se por taxa de percepção o fator determinado pela quantidade média de acertos dentre as questões apresentadas aos alunos, em relação a turma em que o questionario foi aplicado.

print(pos_gabarito$proporcoes$por_turma)

Teste de normalidade

Para determinar a normalidade nas distribuiçoes das respostas do jogo de imagens.

Identificação médio das turmas (nomes das espécies & origens)

grid.arrange(t1$plot, t2$plot,
             t1$normalidade, t2$normalidade,
             t3$plot, t4$plot,
             t3$normalidade, t4$normalidade,
             ncol = 2,
             heights = c(3,2,3,2),
             top = textGrob("Densidade de identificação média das turmas entre \nespecies e suas origens\n",
                            gp = gpar(fontsize = 20, font = 2))
             )

Indice de reconhecimento médio das turmas

grid.arrange(t5$plot, t6$plot,
             t5$normalidade, t6$normalidade,
             ncol = 2,
             heights = c(4,3),
             top = textGrob("Densidade dos indices de reconhecimento médio das turmas\n",
                            gp = gpar(fontsize = 20, font = 2))
             )

Q-Q Test

qqplot.data <- function (vec, titulo) {
  # following four lines from base R's qqline()
  y <- quantile(vec[!is.na(vec)], c(0.25, 0.75))
  x <- qnorm(c(0.25, 0.75))
  slope <- diff(y)/diff(x)
  int <- y[1L] - slope * x[1L]
  d <- data.frame(resids = vec)
  ggplot(d, aes(sample = resids)) + 
      stat_qq() + 
      geom_abline(slope = slope, intercept = int, col = "red") +
      xlim(-2, 2) +
      ylim(0, 1) +
      theme_bw() +
      labs(
        title = titulo
    )
}
q1 <- qqplot.data(pos_gabarito$proporcoes$por_turma$p_nativas, "Identificação do nome das espécies de origem Nativas")
q2 <- qqplot.data(pos_gabarito$proporcoes$por_turma$p_exoticas, "Identificação do nome das espécies de origem Exoticas")
q3 <- qqplot.data(pos_gabarito$proporcoes$por_turma$p_origem_nativas, "Identificação de origem Nativas")
q4 <- qqplot.data(pos_gabarito$proporcoes$por_turma$p_origem_exoticas, "Identificação de origem Exoticas")
q5 <- qqplot.data(pos_gabarito$proporcoes$por_turma$p_indice_nativas, "Indice de reconhecimento Nativas (origens + espécies)")
q6 <- qqplot.data(pos_gabarito$proporcoes$por_turma$p_indice_exoticas, "Indice de reconhecimento Exoticas (origens + espécies)")
grid.arrange(q1, q2, 
             q3, q4,
             q5, q6,
             ncol = 2,
             top = textGrob("Normal Q-Q Plot\n", 
                            gp = gpar(fontsize = 20, font = 2))
             )

Teste de variância

Para determinar a variância

variancia <- data.frame(
    Algoritmo = c("F test to compare two variances"),
    "Comparação" = c("Nativas x Exóticas"),
    "Variável" = c(
        "Indice de reconhecimento",
        "Identificação do nome das espécies",
        "Identificação da origem"
    ),
    "p_valor" = c(
        var.test(pos_gabarito$proporcoes$por_turma$p_indice_nativas, 
                 pos_gabarito$proporcoes$por_turma$p_indice_exoticas, 
                 alternative = "two.sided")$p.value,
        var.test(pos_gabarito$proporcoes$por_turma$p_nativas, 
                 pos_gabarito$proporcoes$por_turma$p_exoticas, 
                 alternative = "two.sided")$p.value,
        var.test(pos_gabarito$proporcoes$por_turma$p_origem_nativas, 
                 pos_gabarito$proporcoes$por_turma$p_origem_exoticas, 
                 alternative = "two.sided")$p.value
    )
)
variancia <- variancia %>%
    mutate(
        variancia = p_valor > 0.05,
        p_valor = cell_spec(round(p_valor, 4), bold = T, color = "black", align = "right"),
        variancia = cell_spec(variancia, bold = variancia,
                       color= ifelse(variancia, "white", "black"), 
                       background = ifelse(variancia, "green", "#CCCCCC"))
    )
variancia %>%
  kable(escape = F) %>%
  kable_styling(c("striped", "bordered"), full_width = TRUE) %>%
  column_spec(1, bold = TRUE) %>%
  collapse_rows(columns = 1:2, valign = "top") 
Algoritmo Comparação Variável p_valor variancia
F test to compare two variances Nativas x Exóticas Indice de reconhecimento 0.279 TRUE
Identificação do nome das espécies 0.6553 TRUE
Identificação da origem 0.0343 FALSE

Analises descritivas

head(pos_gabarito$especies, 10)

Indice de identificação por Origem

pos_gabarito$especies %>% 
    ggplot(aes(especieDesc, fr, fill = grupo)) + 
    geom_bar(stat="identity") +
    geom_text(aes(label = paste0(round(fr * 100, 1), "%")), 
              position = position_dodge(0.9), vjust = 0.5,
              hjust = -0.5) +
    scale_y_continuous(limits = c(0,1.2), labels = scales::percent) +
    facet_wrap(~origem, scales = "free_y") +
    coord_flip() +
    theme_bw() +
    labs(title = "Indice de Identificação por Origem",
         fill = "Grupos", x = "", y = "\nFrequencia relativa") +
    my_theme

Indice de identificação por Espécie

pos_gabarito$especies %>% 
    ggplot(aes(especieDesc, fr, fill = origem)) + 
    geom_bar(stat="identity") +
    geom_text(aes(label = paste0(round(fr * 100, 1), "%")), 
              position = position_dodge(0.9), vjust = 0.5,
              hjust = -0.3) +
    scale_y_continuous(limits = c(0,1.2), labels = scales::percent) +
    facet_wrap(~grupo, scales = "free_y") +
    coord_flip() +
    theme_bw() +
    labs(title = "Indice de Identificação por Espécie",
         fill = "Origem", x = "", y = "\nFrequencia relativa") +
    my_theme

Testes de hipoteses

Esperado p-valor >= 0.05 na normalidade (espera-se H0) Esperado p-valor <= 0.05 no teste de hipotese (espera-se H1)

1 - Os alunos itendificam mais os nomes dos animais de espécies exóticas que os animais de espécies nativas.

tmp <- pos_gabarito$proporcoes$por_turma %>%
  select(turmas, p_nome_exoticas = p_exoticas, p_nome_nativas = p_nativas, p_origem_exoticas:p_indice_nativas) %>%
  melt(id = "turmas")
cbind(tmp, colsplit(tmp$variable, "_", c("p", "indicador", "origem"))) %>%
  select(turmas, indicador, origem, value) %>%
  ggplot() + 
  geom_boxplot(aes(x = origem, y = value, fill = origem), show.legend = T) + 
  scale_y_continuous(limits = c(0,1), labels = scales::percent) +
  facet_wrap(~indicador) +
  theme_bw() +
  labs(title = "Boxplot de identificação dos critérios estabelecidos",
       y = "Percentual de identificação", x = "") +
  my_theme

t1 <- t.test(
       pos_gabarito$proporcoes$por_turma$p_indice_exoticas, 
       pos_gabarito$proporcoes$por_turma$p_indice_nativas, 
       alternative = "two.sided", paired = F, var.equal = T)
t2 <- t.test(
       pos_gabarito$proporcoes$por_turma$p_exoticas, 
       pos_gabarito$proporcoes$por_turma$p_nativas, 
       alternative = "two.sided", paired = F, var.equal = T)
t3 <- t.test(
       pos_gabarito$proporcoes$por_turma$p_origem_exoticas, 
       pos_gabarito$proporcoes$por_turma$p_origem_nativas, 
       alternative = "two.sided", paired = F, var.equal = T)
data.frame(
    Algoritmo = c(t1$method, t2$method, t3$method),
    "Comparação" = c("Exóticas x Nativas"),
    "Variável" = c(
        "Indice de reconhecimento",
        "Identificação do nome das espécies",
        "Identificação da origem"
    ),
    p_valor = c(t1$p.value, t2$p.value, t3$p.value),
    H0 = c(t1$p.value >= 0.05, t2$p.value >= 0.05, t3$p.value >= 0.05),
    H1 = c(t1$p.value < 0.05, t2$p.value < 0.05, t3$p.value < 0.05),
    "Confiança" = c(
        paste(paste0(round(t1$conf.int * 100, 2), "%"), collapse = " ~ "),
        paste(paste0(round(t2$conf.int * 100, 2), "%"), collapse = " ~ "),
        paste(paste0(round(t3$conf.int * 100, 2), "%"), collapse = " ~ ")
    )
) %>%
  mutate(
    p_valor = cell_spec(p_valor, bold = T, color = "black", align = "right"),
    H0 = cell_spec(H0, bold = H0,
                   color= ifelse(H0, "white", "black"), 
                   background = ifelse(H0, "green", "#CCCCCC")),
    H1 = cell_spec(H1, bold = H1, 
                   color = ifelse(H1, "white", "black"), 
                   background = ifelse(H1, "green", "#CCCCCC"))
  ) %>%
  kable(escape = F) %>%
  kable_styling(c("striped", "bordered"), full_width = TRUE) %>%
  column_spec(1, bold = TRUE) %>%
#  column_spec(4, bold = T, color = "darkblue") %>%
  collapse_rows(columns = 1:2, valign = "top") %>%
  footnote(general = "Intervalo de confiança 95%",
           general_title = "\nObs.: ",
           footnote_as_chunk = T)
Algoritmo Comparação Variável p_valor H0 H1 Confiança
Two Sample t-test Exóticas x Nativas Indice de reconhecimento 0.00829379088264213 FALSE TRUE 3.25% ~ 20.26%
Identificação do nome das espécies 2.77135680934484e-09 FALSE TRUE 27.69% ~ 46.21%
Identificação da origem 3.74320861066021e-12 FALSE TRUE -33% ~ -22.49%

Obs.:
Intervalo de confiança 95%

2 - Os alunos identificam mais espécies de origem exótica que as de origem nativa.

t.test(pos_gabarito$proporcoes$por_turma$p_origem_nativas, 
       pos_gabarito$proporcoes$por_turma$p_origem_exoticas, 
       alternative = "two.sided", paired = F, var.equal = T)

    Two Sample t-test

data:  pos_gabarito$proporcoes$por_turma$p_origem_nativas and pos_gabarito$proporcoes$por_turma$p_origem_exoticas
t = 11, df = 32, p-value = 4e-12
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.2249 0.3300
sample estimates:
mean of x mean of y 
   0.8005    0.5231 

3 - Os alunos identificam mais as espécies exóticas (nome dos animais e origem) que espécies nativas.

ANOVA

4 - Os alunos reconhecem mais mamíferos do que os demais grupos taxonómicos.

pos_gabarito$taxonomicos %>%
    ggplot() + 
    geom_boxplot(aes(x = grupo, y = value, fill = origem), show.legend = T) + 
    scale_y_continuous(limits = c(0,1), labels = scales::percent) +
    theme_bw() +
    labs(title = "Boxplot de identificação de espécies por grupo taxonômico",
         y = "Percentual de identificação", x = "") +
    my_theme

anova(lm(value ~ grupo * origem, pos_gabarito$taxonomicos))
Analysis of Variance Table

Response: value
              Df Sum Sq Mean Sq F value Pr(>F)    
grupo          4   0.71    0.18    2.37  0.055 .  
origem         1   5.80    5.80   77.52  2e-15 ***
grupo:origem   4   0.79    0.20    2.63  0.037 *  
Residuals    160  11.98    0.07                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
TukeyHSD(aov(lm(value ~ grupo * origem, pos_gabarito$taxonomicos)))
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = lm(value ~ grupo * origem, pos_gabarito$taxonomicos))

$grupo
                           diff      lwr     upr  p adj
invertebrado-aves     -0.152016 -0.33512 0.03109 0.1533
mamifero-aves          0.002443 -0.18066 0.18554 1.0000
peixe-aves            -0.050865 -0.23397 0.13224 0.9398
reptil-aves           -0.130897 -0.31400 0.05221 0.2842
mamifero-invertebrado  0.154459 -0.02864 0.33756 0.1416
peixe-invertebrado     0.101150 -0.08195 0.28425 0.5483
reptil-invertebrado    0.021119 -0.16198 0.20422 0.9978
peixe-mamifero        -0.053308 -0.23641 0.12979 0.9293
reptil-mamifero       -0.133339 -0.31644 0.04976 0.2663
reptil-peixe          -0.080031 -0.26313 0.10307 0.7479

$origem
                  diff     lwr     upr p adj
nativa-exotica -0.3695 -0.4524 -0.2866     0

$`grupo:origem`
                                              diff     lwr       upr  p adj
invertebrado:exotica-aves:exotica        -0.033503 -0.3347  0.267652 1.0000
mamifero:exotica-aves:exotica             0.103885 -0.1973  0.405040 0.9834
peixe:exotica-aves:exotica                0.109394 -0.1918  0.410549 0.9764
reptil:exotica-aves:exotica              -0.143444 -0.4446  0.157711 0.8788
aves:nativa-aves:exotica                 -0.222463 -0.5236  0.078692 0.3507
invertebrado:nativa-aves:exotica         -0.492991 -0.7941 -0.191836 0.0000
mamifero:nativa-aves:exotica             -0.321463 -0.6226 -0.020307 0.0262
peixe:nativa-aves:exotica                -0.433588 -0.7347 -0.132433 0.0003
reptil:nativa-aves:exotica               -0.340812 -0.6420 -0.039657 0.0135
mamifero:exotica-invertebrado:exotica     0.137388 -0.1638  0.438544 0.9042
peixe:exotica-invertebrado:exotica        0.142898 -0.1583  0.444053 0.8812
reptil:exotica-invertebrado:exotica      -0.109941 -0.4111  0.191214 0.9756
aves:nativa-invertebrado:exotica         -0.188960 -0.4901  0.112195 0.5909
invertebrado:nativa-invertebrado:exotica -0.459488 -0.7606 -0.158333 0.0001
mamifero:nativa-invertebrado:exotica     -0.287959 -0.5891  0.013196 0.0739
peixe:nativa-invertebrado:exotica        -0.400085 -0.7012 -0.098930 0.0014
reptil:nativa-invertebrado:exotica       -0.307309 -0.6085 -0.006154 0.0414
peixe:exotica-mamifero:exotica            0.005509 -0.2956  0.306665 1.0000
reptil:exotica-mamifero:exotica          -0.247329 -0.5485  0.053826 0.2102
aves:nativa-mamifero:exotica             -0.326348 -0.6275 -0.025193 0.0223
invertebrado:nativa-mamifero:exotica     -0.596876 -0.8980 -0.295721 0.0000
mamifero:nativa-mamifero:exotica         -0.425347 -0.7265 -0.124192 0.0005
peixe:nativa-mamifero:exotica            -0.537473 -0.8386 -0.236318 0.0000
reptil:nativa-mamifero:exotica           -0.444697 -0.7459 -0.143542 0.0002
reptil:exotica-peixe:exotica             -0.252838 -0.5540  0.048317 0.1851
aves:nativa-peixe:exotica                -0.331858 -0.6330 -0.030703 0.0185
invertebrado:nativa-peixe:exotica        -0.602386 -0.9035 -0.301230 0.0000
mamifero:nativa-peixe:exotica            -0.430857 -0.7320 -0.129702 0.0004
peixe:nativa-peixe:exotica               -0.542982 -0.8441 -0.241827 0.0000
reptil:nativa-peixe:exotica              -0.450207 -0.7514 -0.149052 0.0002
aves:nativa-reptil:exotica               -0.079019 -0.3802  0.222136 0.9978
invertebrado:nativa-reptil:exotica       -0.349547 -0.6507 -0.048392 0.0099
mamifero:nativa-reptil:exotica           -0.178018 -0.4792  0.123137 0.6712
peixe:nativa-reptil:exotica              -0.290144 -0.5913  0.011011 0.0694
reptil:nativa-reptil:exotica             -0.197368 -0.4985  0.103787 0.5282
invertebrado:nativa-aves:nativa          -0.270528 -0.5717  0.030627 0.1192
mamifero:nativa-aves:nativa              -0.098999 -0.4002  0.202156 0.9881
peixe:nativa-aves:nativa                 -0.211125 -0.5123  0.090030 0.4278
reptil:nativa-aves:nativa                -0.118349 -0.4195  0.182806 0.9606
mamifero:nativa-invertebrado:nativa       0.171529 -0.1296  0.472684 0.7167
peixe:nativa-invertebrado:nativa          0.059403 -0.2418  0.360558 0.9998
reptil:nativa-invertebrado:nativa         0.152179 -0.1490  0.453334 0.8358
peixe:nativa-mamifero:nativa             -0.112126 -0.4133  0.189030 0.9722
reptil:nativa-mamifero:nativa            -0.019350 -0.3205  0.281805 1.0000
reptil:nativa-peixe:nativa                0.092776 -0.2084  0.393931 0.9926

5 - Estudantes que residem na Cidade 1 (com UC) identificam mais espécies nativas do que estudantes que residem na Cidade 2 (sem UC).

tmp <-
    merge(
        pos_gabarito$dados %>% 
            select(turmas, municipio) %>% 
            unique(),
        pos_gabarito$proporcoes$por_turma_area
    ) %>%
    select(municipio, area, value = p_nativas) %>%
    tbl_df()
t.test(value ~ municipio, tmp)

    Welch Two Sample t-test

data:  value by municipio
t = 0.83, df = 28, p-value = 0.4
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.06479  0.15254
sample estimates:
mean in group Bela Vista de Goiás            mean in group Silvânia 
                           0.3869                            0.3431 
# anova(lm(value ~ municipio, tmp))
# #plot(lm(value ~ municipio, tmp))
# TukeyHSD(aov(lm(value ~ municipio, tmp)))
tmp %>%
  ggplot() + 
  geom_boxplot(aes(x = area, y = value, fill = municipio), show.legend = T) + 
  scale_y_continuous(limits = c(0,1), labels = scales::percent) +
  facet_wrap(~municipio) +
  theme_bw() +
  labs(title = "Boxplot de identificação de espécies Nativas nos critérios estabelecidos",
       y = "Percentual de identificação", x = "") +
  my_theme

6 - Estudantes que residem em área rural tem maior conhecimento sobre as espécies nativas.

tmp <- 
    pos_gabarito$proporcoes$por_turma_area %>%
    select(municipio, area, p_nome_nativas = p_nativas, p_origem_nativas, p_indice_nativas) %>%
    arrange(area) %>%
    melt(id = c("municipio", "area"))
tmp <-
    cbind(tmp, colsplit(tmp$variable, "_", c("p", "indicador", "origem"))) %>%
    select(municipio, area, indicador, origem, value)
tmp %>%
  ggplot() + 
  geom_boxplot(aes(x = area, y = value, fill = municipio), show.legend = T) + 
  scale_y_continuous(limits = c(0,1), labels = scales::percent) +
  facet_wrap(~indicador) +
  theme_bw() +
  labs(title = "Boxplot de identificação de espécies Nativas nos critérios estabelecidos",
       y = "Percentual de identificação", x = "") +
  my_theme

#boxplot(value  ~ municipio + area, data = tmp)
# interaction.plot(tmp$area, tmp$municipio, tmp$value)
# interaction.plot(tmp$municipio, tmp$area, tmp$value)
# aggregate(value ~ area * municipio, data = tmp, FUN = function(x) shapiro.test(x)$p.value)
# tmp$bart = paste(tmp$municipio, "-", tmp$area)
# bartlett.test(value ~ bart, data = tmp)
t.anova <- anova(lm(value  ~ municipio * area, data = tmp %>% filter(indicador == "indice")))
t.anova %>%
    kable() %>%
    kable_styling(c("striped", "bordered"), full_width = TRUE) %>%
    column_spec(1, bold = TRUE)

Df Sum Sq Mean Sq F value Pr(>F)
municipio 1 0.0032 0.0032 0.1321 0.7189
area 1 0.0105 0.0105 0.4332 0.5156
municipio:area 1 0.0001 0.0001 0.0021 0.9633
Residuals 29 0.7057 0.0243 NA NA

tukey <- TukeyHSD(aov(lm(value  ~ municipio * area, data = tmp %>% filter(indicador == "indice"))))
tukey
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = lm(value ~ municipio * area, data = tmp %>% filter(indicador == "indice")))

$municipio
                                 diff     lwr     upr  p adj
Silvânia-Bela Vista de Goiás -0.01975 -0.1309 0.09138 0.7189

$area
                diff      lwr    upr  p adj
Urbana-Rural 0.03575 -0.07538 0.1469 0.5158

$`municipio:area`
                                                         diff     lwr    upr  p adj
Silvânia:Rural-Bela Vista de Goiás:Rural             -0.02339 -0.2359 0.1891 0.9904
Bela Vista de Goiás:Urbana-Bela Vista de Goiás:Rural  0.03318 -0.1793 0.2457 0.9737
Silvânia:Urbana-Bela Vista de Goiás:Rural             0.01483 -0.1917 0.2213 0.9973
Bela Vista de Goiás:Urbana-Silvânia:Rural             0.05658 -0.1559 0.2691 0.8861
Silvânia:Urbana-Silvânia:Rural                        0.03823 -0.1683 0.2447 0.9574
Silvânia:Urbana-Bela Vista de Goiás:Urbana           -0.01835 -0.2249 0.1882 0.9949
#plot(tukey)
tk <- as.data.frame(tukey$`municipio:area`)
tk$comparacao = rownames(tk)
rownames(tk) = NULL
tk %>%
    select(comparacao, diff:`p adj`) %>%
    mutate(significancia = `p adj` <= 0.05) %>%
    kable() %>%
    kable_styling(c("striped", "bordered"), full_width = TRUE) %>%
    column_spec(1, bold = TRUE)
comparacao diff lwr upr p adj significancia
Silvânia:Rural-Bela Vista de Goiás:Rural -0.0234 -0.2359 0.1891 0.9904 FALSE
Bela Vista de Goiás:Urbana-Bela Vista de Goiás:Rural 0.0332 -0.1793 0.2457 0.9737 FALSE
Silvânia:Urbana-Bela Vista de Goiás:Rural 0.0148 -0.1917 0.2213 0.9973 FALSE
Bela Vista de Goiás:Urbana-Silvânia:Rural 0.0566 -0.1559 0.2691 0.8861 FALSE
Silvânia:Urbana-Silvânia:Rural 0.0382 -0.1683 0.2447 0.9574 FALSE
Silvânia:Urbana-Bela Vista de Goiás:Urbana -0.0184 -0.2249 0.1882 0.9949 FALSE

7 -

8 - Frequencia de contato natureza

tmp <- 
    pos_gabarito$proporcoes$por_turma_freq_contato %>%
    select(frequencia, p_nome_nativas = p_nativas, p_origem_nativas, p_indice_nativas) %>%
    arrange(frequencia) %>%
    melt(id = "frequencia")
tmp <-
    cbind(tmp, colsplit(tmp$variable, "_", c("p", "indicador", "origem"))) %>%
    select(frequencia, indicador, origem, value)
tmp %>%
  ggplot() + 
  geom_boxplot(aes(x = frequencia, y = value, fill = frequencia), show.legend = T) + 
  scale_y_continuous(limits = c(0,1), labels = scales::percent) +
  facet_wrap(~indicador) +
  theme_bw() +
  labs(title = "Boxplot de identificação de espécies Nativas nos critérios estabelecidos",
       y = "Percentual de identificação", x = "") +
  my_theme

# aggregate(value ~ frequencia, 
#           data = tmp %>% filter(indicador == "indice"), 
#           FUN = function(x) shapiro.test(x)$p.value)
t.anova <- anova(lm(value  ~ frequencia, data = tmp %>% filter(indicador == "indice")))
t.anova %>%
    kable() %>%
    kable_styling(c("striped", "bordered"), full_width = TRUE) %>%
    column_spec(1, bold = TRUE)

Df Sum Sq Mean Sq F value Pr(>F)
frequencia 4 0.1316 0.0329 1.279 0.2883
Residuals 61 1.5693 0.0257 NA NA

tukey <- TukeyHSD(aov(lm(value  ~ frequencia, data = tmp %>% filter(indicador == "indice"))))
tukey
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = lm(value ~ frequencia, data = tmp %>% filter(indicador == "indice")))

$frequencia
                              diff      lwr    upr  p adj
Raramente-Nunca           0.370714 -0.09599 0.8374 0.1816
Ás vezes-Nunca            0.325893 -0.13806 0.7898 0.2906
Frequentemente-Nunca      0.332468 -0.13148 0.7964 0.2716
Sempre-Nunca              0.334260 -0.12969 0.7982 0.2665
Ás vezes-Raramente       -0.044821 -0.20755 0.1179 0.9371
Frequentemente-Raramente -0.038247 -0.20097 0.1245 0.9639
Sempre-Raramente         -0.036454 -0.19918 0.1263 0.9697
Frequentemente-Ás vezes   0.006574 -0.14808 0.1612 1.0000
Sempre-Ás vezes           0.008367 -0.14628 0.1630 0.9999
Sempre-Frequentemente     0.001793 -0.15286 0.1564 1.0000
#plot(tukey)
tk <- as.data.frame(tukey$frequencia)
tk$comparacao = rownames(tk)
rownames(tk) = NULL
tk %>%
    select(comparacao, diff:`p adj`) %>%
    mutate(significancia = `p adj` <= 0.05) %>%
    kable() %>%
    kable_styling(c("striped", "bordered"), full_width = TRUE) %>%
    column_spec(1, bold = TRUE)
comparacao diff lwr upr p adj significancia
Raramente-Nunca 0.3707 -0.0960 0.8374 0.1816 FALSE
Ás vezes-Nunca 0.3259 -0.1381 0.7898 0.2906 FALSE
Frequentemente-Nunca 0.3325 -0.1315 0.7964 0.2716 FALSE
Sempre-Nunca 0.3343 -0.1297 0.7982 0.2665 FALSE
Ás vezes-Raramente -0.0448 -0.2075 0.1179 0.9371 FALSE
Frequentemente-Raramente -0.0382 -0.2010 0.1245 0.9639 FALSE
Sempre-Raramente -0.0365 -0.1992 0.1263 0.9697 FALSE
Frequentemente-Ás vezes 0.0066 -0.1481 0.1612 1.0000 FALSE
Sempre-Ás vezes 0.0084 -0.1463 0.1630 0.9999 FALSE
Sempre-Frequentemente 0.0018 -0.1529 0.1564 1.0000 FALSE

9 - Fez aulas praticas

tmp <- 
    pos_gabarito$proporcoes$por_turma_fez_aula %>%
    select(fez.aula, p_nome_nativas = p_nativas, p_origem_nativas, p_indice_nativas) %>%
    arrange(fez.aula) %>%
    melt(id = "fez.aula")
tmp <- cbind(tmp, colsplit(tmp$variable, "_", c("p", "indicador", "origem"))) %>%
  select(fez.aula, indicador, origem, value) 
tmp %>%
  ggplot() + 
  geom_boxplot(aes(x = fez.aula, y = value, fill = fez.aula), show.legend = T) + 
  scale_y_continuous(limits = c(0,1), labels = scales::percent) +
  facet_wrap(~indicador) +
  theme_bw() +
  labs(title = "Boxplot de identificação de espécies Nativas nos critérios estabelecidos - Alunos que fizeram aula",
       y = "Percentual de identificação", x = "") +
  my_theme

anova_fez.aula <- teste.anova(formula = value ~ fez.aula, 
            data = tmp %>% filter(indicador == "indice"))
anova_fez.aula$teste.normalidade

fez.aula value H0 normalidade
Não fez 0.4445 FALSE FALSE
Sim, fazenda 0.6779 FALSE FALSE
Sim, FLONA 0.2359 FALSE FALSE
Sim, memorial do cerrado 0.8784 FALSE FALSE
Sim, outro 0.2117 FALSE FALSE
Sim, parque ou trilha 0.0414 TRUE TRUE
Sim, zoologico 0.4950 FALSE FALSE

anova_fez.aula$teste.anova
Analysis of Variance Table

Response: value
          Df Sum Sq Mean Sq F value Pr(>F)
fez.aula   6  0.127  0.0212    0.62   0.71
Residuals 61  2.085  0.0342               
anova_fez.aula$tabela.tukey
comparacao diff lwr upr p adj significancia
Sim, fazenda-Não fez -0.1000 -0.3867 0.1868 0.9364 FALSE
Sim, FLONA-Não fez 0.0446 -0.1971 0.2863 0.9976 FALSE
Sim, memorial do cerrado-Não fez 0.0481 -0.2050 0.3012 0.9972 FALSE
Sim, outro-Não fez 0.0467 -0.2210 0.3143 0.9983 FALSE
Sim, parque ou trilha-Não fez -0.0155 -0.2088 0.1779 1.0000 FALSE
Sim, zoologico-Não fez 0.0675 -0.1742 0.3092 0.9781 FALSE
Sim, FLONA-Sim, fazenda 0.1446 -0.1768 0.4659 0.8144 FALSE
Sim, memorial do cerrado-Sim, fazenda 0.1481 -0.1820 0.4781 0.8164 FALSE
Sim, outro-Sim, fazenda 0.1467 -0.1946 0.4880 0.8446 FALSE
Sim, parque ou trilha-Sim, fazenda 0.0845 -0.2023 0.3713 0.9715 FALSE
Sim, zoologico-Sim, fazenda 0.1675 -0.1538 0.4888 0.6895 FALSE
Sim, memorial do cerrado-Sim, FLONA 0.0035 -0.2882 0.2952 1.0000 FALSE
Sim, outro-Sim, FLONA 0.0021 -0.3023 0.3065 1.0000 FALSE
Sim, parque ou trilha-Sim, FLONA -0.0601 -0.3017 0.1816 0.9880 FALSE
Sim, zoologico-Sim, FLONA 0.0229 -0.2589 0.3047 1.0000 FALSE
Sim, outro-Sim, memorial do cerrado -0.0014 -0.3150 0.3122 1.0000 FALSE
Sim, parque ou trilha-Sim, memorial do cerrado -0.0636 -0.3167 0.1896 0.9874 FALSE
Sim, zoologico-Sim, memorial do cerrado 0.0194 -0.2723 0.3112 1.0000 FALSE
Sim, parque ou trilha-Sim, outro -0.0622 -0.3298 0.2055 0.9916 FALSE
Sim, zoologico-Sim, outro 0.0208 -0.2836 0.3252 1.0000 FALSE
Sim, zoologico-Sim, parque ou trilha 0.0830 -0.1587 0.3247 0.9406 FALSE

10 - Estudantes da Cidade 1 (com UC) tem maior número de acertos de espécies nativas.

tmp <- 
    pos_gabarito$proporcoes$por_turma_flona %>%
    select(flona, p_nome_nativas = p_nativas, p_origem_nativas, p_indice_nativas) %>%
    arrange(flona) %>%
    melt(id = "flona")
tmp <- cbind(tmp, colsplit(tmp$variable, "_", c("p", "indicador", "origem"))) %>%
  select(flona, indicador, origem, value) 
tmp %>%
  ggplot() + 
  geom_boxplot(aes(x = flona, y = value, fill = flona), show.legend = T) + 
  scale_y_continuous(limits = c(0,1), labels = scales::percent) +
  facet_wrap(~indicador) +
  theme_bw() +
  labs(title = "Boxplot de identificação de espécies Nativas nos critérios estabelecidos - Alunos que visitaram a Flona",
       y = "Percentual de identificação", x = "") +
  my_theme

anova_flona <- teste.anova(formula = value ~ flona, 
            data = tmp %>% filter(indicador == "indice"))
anova_flona$teste.normalidade

flona value H0 normalidade
Não 0.2036 FALSE FALSE
Sim 0.0249 TRUE TRUE

anova_flona$teste.anova
Analysis of Variance Table

Response: value
          Df Sum Sq Mean Sq F value Pr(>F)
flona      1  0.015  0.0147    0.48    0.5
Residuals 16  0.485  0.0303               
anova_flona$tabela.tukey
comparacao diff lwr upr p adj significancia
Sim-Não 0.0571 -0.1168 0.2311 0.4962 FALSE

11 - Ranking dos animais

a1 <- 
    pos_gabarito$raking_animais$nativos %>%
    head(20) %>%
    ggplot(aes(x = animais, y = freq, fill = freq)) +
    geom_bar(stat="identity", show.legend = F) +
    geom_text(aes(label = freq), position = position_dodge(0.9), vjust = -1, hjust = 0.5) +
    scale_y_continuous(limits = c(0,90)) +
    scale_fill_gradient(low = "orange", high = "red") +
    theme_bw() +
    labs(title = "Espécies citadas como nativas",
       y = "Frequencia", x = "") +
    my_theme
a2 <- 
    pos_gabarito$raking_animais$exoticos %>%
    head(20) %>%
    ggplot(aes(x = animais, y = freq, fill = freq)) +
    geom_bar(stat="identity", show.legend = F) +
    geom_text(aes(label = freq), position = position_dodge(0.9), vjust = -1, hjust = 0.5) +
    scale_y_continuous(limits = c(0,90)) +
    scale_fill_gradient(low = "lightblue", high = "darkblue") +
    theme_bw() +
    labs(title = "Espécies citadas como exóticas",
       y = "Frequencia", x = "") +
    my_theme
grid.arrange(a1, a2,
             nrow = 2,
             top = textGrob("TOP 20 - Ranking das espécies citadas como exemplo\n", 
                            gp = gpar(fontsize = 20, font = 2))
)

13 - Ranking dos animais citados para proteção

LS0tCnRpdGxlOiAiTWVzdHJhZG8gQmlvbG9naWEiCmF1dGhvcjogIkhlcnNvbiBNZWxvIgpkYXRlOiAiMjgvMDYvMjAxOCIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IAogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogNQotLS0KCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgaW5jbHVkZSA9IEZBTFNFfQpsaWJyYXJ5KGx1YnJpZGF0ZSkKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShzdHJpbmdyKQpsaWJyYXJ5KHJlc2hhcGUyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ2dwdWJyKQpsaWJyYXJ5KGdyaWQpCmxpYnJhcnkoZ3JpZEV4dHJhKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkobm9ydGVzdCkKbGlicmFyeShzdGF0cykKbGlicmFyeShtdWx0Y29tcFZpZXcpCgpzdXBwcmVzc1dhcm5pbmdzKFN5cy5zZXRsb2NhbGUoIkxDX0FMTCIsICdlbl9VUy5VVEYtOCcpKQojb3B0aW9ucyhzY2lwZW4gPSA5OTksIGRpZ2l0cyA9IDQpCm9wdGlvbnMoc2NpcGVuID0gMCwgZGlnaXRzID0gNCkKIyBvcHRpb25zKCJzY2lwZW4iPS0xMDAsICJkaWdpdHMiPTYpCiMgZ2V0d2QoKQpsb2FkKCJkYWRvcy5SRGF0YSIpCgoKbXlfdGhlbWUgPC0gCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDI1LCBoanVzdCA9IDEsIHNpemUgPSAxMiksIAogICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgICAgdGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LCBmYWNlID0gImJvbGQiKSwKICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKQoKIyBJbXBsZW1lbnRhbmRvIGZvcm11bGEgcGFyYSB0ZXN0ZXMgZXN0YXTDrXN0aWNvcyBwYWRyb25pemFkYQp0ZXN0ZS5hbm92YSA8LSBmdW5jdGlvbihmb3JtdWxhLCBkYXRhKSB7CiAgICB0Lm5vcm1hbGlkYWRlIDwtIAogICAgICAgIGFnZ3JlZ2F0ZShmb3JtdWxhLCBkYXRhLCAKICAgICAgICAgICAgICAgICAgRlVOID0gZnVuY3Rpb24oeCkgc2hhcGlyby50ZXN0KHgpJHAudmFsdWUpICU+JQogICAgICAgIG11dGF0ZShIMCA9ICh2YWx1ZSA8PSAwLjA1KSwKICAgICAgICAgICAgICAgbm9ybWFsaWRhZGUgPSBjZWxsX3NwZWMoSDAsIGJvbGQgPSBIMCwKICAgICAgICAgICAgICAgICAgIGNvbG9yPSBpZmVsc2UoSDAsICJ3aGl0ZSIsICJibGFjayIpLCAKICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQgPSBpZmVsc2UoSDAsICJncmVlbiIsICIjQ0NDQ0NDIikpCiAgICAgICAgICAgICAgICkgJT4lCiAgICAgICAga2FibGUoZXNjYXBlID0gRikgJT4lCiAgICAgICAga2FibGVfc3R5bGluZyhjKCJzdHJpcGVkIiwgImJvcmRlcmVkIiksIGZ1bGxfd2lkdGggPSBUUlVFKSAlPiUKICAgICAgICBjb2x1bW5fc3BlYygxLCBib2xkID0gVFJVRSkKCiAgICB0LmFub3ZhIDwtIGFub3ZhKGxtKGZvcm11bGEsIGRhdGEpKQogICAgdC50dWtleSA8LSBUdWtleUhTRChhb3YobG0oZm9ybXVsYSwgZGF0YSkpKQoKICAgIGlmKGxlbmd0aCh0LnR1a2V5KSA+IDEpIHsKICAgICAgICBlcnJvcigiQU5PVkEgZmF0b3JpYWwgKGZhbHRhIHRyYXRhciBpc3NvKSEiKQogICAgfQogICAgdHVrZXkudGJsIDwtIGFzLmRhdGEuZnJhbWUodC50dWtleVtbMV1dLCBjdXQubmFtZXMgPSBGKQogICAgdHVrZXkudGJsJGNvbXBhcmFjYW8gPSByb3duYW1lcyh0dWtleS50YmwpCiAgICByb3duYW1lcyh0dWtleS50YmwpID0gTlVMTAogICAgdGFiZWxhLnR1a2V5IDwtIHR1a2V5LnRibCAlPiUKICAgICAgICBtdXRhdGUoSDAgPSAoYHAgYWRqYCA8PSAwLjA1KSwKICAgICAgICAgICAgICAgc2lnbmlmaWNhbmNpYSA9IGNlbGxfc3BlYyhIMCwgYm9sZCA9IEgwLAogICAgICAgICAgICAgICAgICAgY29sb3I9IGlmZWxzZShIMCwgIndoaXRlIiwgImJsYWNrIiksIAogICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZCA9IGlmZWxzZShIMCwgImdyZWVuIiwgIiNDQ0NDQ0MiKSkKICAgICAgICAgICAgICAgKSAlPiUKICAgICAgICBzZWxlY3QoY29tcGFyYWNhbywgZGlmZjpgcCBhZGpgLCBzaWduaWZpY2FuY2lhKSAlPiUKICAgICAgICBrYWJsZShlc2NhcGUgPSBGKSAlPiUKICAgICAgICBrYWJsZV9zdHlsaW5nKGMoInN0cmlwZWQiLCAiYm9yZGVyZWQiKSwgZnVsbF93aWR0aCA9IFRSVUUpICU+JQogICAgICAgIGNvbHVtbl9zcGVjKDEsIGJvbGQgPSBUUlVFKQogICAgCiAgICAgICAgCiAgICByZXN1bHRhZG8gPC0gCiAgICAgICAgbGlzdCgKICAgICAgICAgICAgdGVzdGUubm9ybWFsaWRhZGUgPSB0Lm5vcm1hbGlkYWRlLAogICAgICAgICAgICB0ZXN0ZS5hbm92YSA9IHQuYW5vdmEsCiAgICAgICAgICAgIHR1a2V5ID0gdC50dWtleSwKICAgICAgICAgICAgdGFiZWxhLnR1a2V5ID0gdGFiZWxhLnR1a2V5CiAgICAgICAgKQogICAgcmV0dXJuKHJlc3VsdGFkbykKfQoKYGBgCgojIyBBbsOhbGlzZSBkbyBKb2dvIGRlIEltYWdlbnMgYXBsaWNhZGFzIG5vIEVuc2lubyBtw6lkaW8KCgojIyMgQW1vc3RyYSBkb3MgZGFkb3MgZGEgcGVzcXVpc2EgcmVhbGl6YWRhCgpUYWJ1bGHDp8OjbyBkbyBuw7ptZXJvIGRlIGFjZXJ0b3MgZG9zIGl0ZW5zIGRvIGpvZ28gZGUgaW1hZ2Vucy4KCmBgYHtyLCBlY2hvPUZBTFNFfQpkZXNjX2NvbHVuYXMgPC0gZGF0YS5mcmFtZSgKICAgICJDb2x1bmEiID0gYygiRXhvdGljYXMiLCAiTmF0aXZhcyIpLAogICAgIkRlc2NyacOnw6NvIiA9IGMoIk7Dum1lcm8gZGUgYWNlcnRvcyBkZW50cmUgdG9kYXMgYXMgaW1hZ2VucyBleGliaWRhcyBkbyB0aXBvIGV4w7N0aWNhLCB2YWxvciBleHBlcmFkbyDDqSA1LiIsCiAgICAgICAgICAgICAgICAgICAgIk7Dum1lcm8gZGUgYWNlcnRvcyBkZW50cmUgdG9kYXMgYXMgaW1hZ2VucyBleGliaWRhcyBkbyB0aXBvIG5hdGl2YSwgdmFsb3IgZXhwZXJhZG8gw6kgNS4iKQogICAgKQpkZXNjX2NvbHVuYXMgJT4lCiAga2FibGUoKSAlPiUKICBrYWJsZV9zdHlsaW5nKGMoInN0cmlwZWQiLCAiYm9yZGVyZWQiKSwgZnVsbF93aWR0aCA9IFRSVUUpICU+JQogIGNvbHVtbl9zcGVjKDEsIGJvbGQgPSBUUlVFKQoKYGBgCgoKYGBge3J9CmhlYWQocG9zX2dhYmFyaXRvJGRhZG9zLCAxMCkKYGBgCgojIyMjIERldGVybWluYWRvIGEgdGF4YSBkZSBwZXJjZXDDp8OjbwoKRW50ZW5kZS1zZSBwb3IgdGF4YSBkZSBwZXJjZXDDp8OjbyBvIGZhdG9yIGRldGVybWluYWRvIHBlbGEgcXVhbnRpZGFkZSBtw6lkaWEgZGUgYWNlcnRvcyBkZW50cmUgYXMgcXVlc3TDtWVzIGFwcmVzZW50YWRhcyBhb3MgYWx1bm9zLCBlbSByZWxhw6fDo28gYSB0dXJtYSBlbSBxdWUgbyBxdWVzdGlvbmFyaW8gZm9pIGFwbGljYWRvLgoKYGBge3J9CnByaW50KHBvc19nYWJhcml0byRwcm9wb3Jjb2VzJHBvcl90dXJtYSkKYGBgCgojIyMgVGVzdGUgZGUgbm9ybWFsaWRhZGUKClBhcmEgZGV0ZXJtaW5hciBhIG5vcm1hbGlkYWRlIG5hcyBkaXN0cmlidWnDp29lcyBkYXMgcmVzcG9zdGFzIGRvIGpvZ28gZGUgaW1hZ2Vucy4KCmBgYHtyLCBlY2hvPUZBTFNFfQpub3JtYWxpZGFkZSA8LSBmdW5jdGlvbih4KSB7CiAgICB0MSA8LSBzaGFwaXJvLnRlc3QoeCkKICAgIHQyIDwtIHNmLnRlc3QoeCkKICAgIHQzIDwtIGxpbGxpZS50ZXN0KHgpCiAgICB0NCA8LSBhZC50ZXN0KHgpCiAgICB0NSA8LSBjdm0udGVzdCh4KQogICAgcmV0dXJuKCBkYXRhLmZyYW1lKAogICAgICAgIEFsZ29yaXRtbyA9IGModDEkbWV0aG9kLCB0MiRtZXRob2QsIAogICAgICAgICAgICAgICAgICAgdDMkbWV0aG9kLCB0NCRtZXRob2QsIAogICAgICAgICAgICAgICAgICAgdDUkbWV0aG9kKSwKICAgICAgICBwLnZhbG9yID0gYyh0MSRwLnZhbHVlLCB0MiRwLnZhbHVlLCAKICAgICAgICAgICAgICAgICAgICB0MyRwLnZhbHVlLCB0NCRwLnZhbHVlLCAKICAgICAgICAgICAgICAgICAgICB0NSRwLnZhbHVlKSwKICAgICAgICBOb3JtYWxpZGFkZSA9IGModDEkcC52YWx1ZSA+IC4wNSwgdDIkcC52YWx1ZSA+IC4wNSwgCiAgICAgICAgICAgICAgICAgICAgICB0MyRwLnZhbHVlID4gLjA1LCB0NCRwLnZhbHVlID4gLjA1LCAKICAgICAgICAgICAgICAgICAgICAgIHQ1JHAudmFsdWUgPiAuMDUpCiAgICApKQp9CgpncmFmaWNvX2RlbnNpZGFkZSA8LSBmdW5jdGlvbih2YXJpYXZlbCwgY29yLCB0aXR1bG8pIHsKICAgIHBsb3QgPC0gCiAgICAgICAgcG9zX2dhYmFyaXRvJHByb3BvcmNvZXMkcG9yX3R1cm1hICU+JSAKICAgICAgICBnZ2RlbnNpdHkoeCA9IHZhcmlhdmVsLCBmaWxsID0gY29yLAogICAgICAgICAgbWFpbiA9IHRpdHVsbywKICAgICAgICAgIHhsYWIgPSAiUGVyY2VudHVhbCBkZSBhY2VydG9zIikgKyAKICAgICAgICB4bGltKDAsIDEpICsgCiAgICAgICAgeWxpbSgwLCA4KQogICAgbm9tYWxpZGFkZSA8LSAKICAgICAgICBnZ3RleHR0YWJsZSgKICAgICAgICAgICAgbm9ybWFsaWRhZGUocG9zX2dhYmFyaXRvJHByb3BvcmNvZXMkcG9yX3R1cm1hW1t2YXJpYXZlbF1dKSwgCiAgICAgICAgICAgIHJvd3MgPSBOVUxMLCB0aGVtZSA9IHR0aGVtZShiYXNlX3N0eWxlID0gIm1PcmFuZ2UiLCBiYXNlX3NpemUgPSA4KQogICAgICAgICkKICAgIAogICAgcmVzdWx0YWRvIDwtIGxpc3QoCiAgICAgICAgcGxvdCA9IHBsb3QsCiAgICAgICAgbm9ybWFsaWRhZGUgPSBub21hbGlkYWRlCiAgICApCiAgICByZXR1cm4ocmVzdWx0YWRvKQp9Cgp0MSA8LSBncmFmaWNvX2RlbnNpZGFkZSgicF9uYXRpdmFzIiwgImdyZWVuIiwgIklkZW50aWZpY2HDp8OjbyBkbyBub21lIGRhcyBlc3DDqWNpZXMgZGUgb3JpZ2VtIE5hdGl2YXMiKQp0MiA8LSBncmFmaWNvX2RlbnNpZGFkZSgicF9leG90aWNhcyIsICJyZWQiLCAiSWRlbnRpZmljYcOnw6NvIGRvIG5vbWUgZGFzIGVzcMOpY2llcyBkZSBvcmlnZW0gRXjDs3RpY2FzIikKdDMgPC0gZ3JhZmljb19kZW5zaWRhZGUoInBfb3JpZ2VtX25hdGl2YXMiLCAiZGFya2dyZWVuIiwgIklkZW50aWZpY2HDp8OjbyBkZSBvcmlnZW0gTmF0aXZhcyIpCnQ0IDwtIGdyYWZpY29fZGVuc2lkYWRlKCJwX29yaWdlbV9leG90aWNhcyIsICJkYXJrcmVkIiwgIklkZW50aWZpY2HDp8OjbyBkZSBvcmlnZW0gRXjDs3RpY2FzIikKdDUgPC0gZ3JhZmljb19kZW5zaWRhZGUoInBfaW5kaWNlX25hdGl2YXMiLCAib3JhbmdlIiwgIkluZGljZSBkZSByZWNvbmhlY2ltZW50byBOYXRpdmFzIChvcmlnZW5zICsgZXNww6ljaWVzKSIpCnQ2IDwtIGdyYWZpY29fZGVuc2lkYWRlKCJwX2luZGljZV9leG90aWNhcyIsICJvcmFuZ2VyZWQiLCAiSW5kaWNlIGRlIHJlY29uaGVjaW1lbnRvIEV4w7N0aWNhcyAob3JpZ2VucyArIGVzcMOpY2llcykiKQpgYGAKCiMjIyMgSWRlbnRpZmljYcOnw6NvIG3DqWRpbyBkYXMgdHVybWFzIChub21lcyBkYXMgZXNww6ljaWVzICYgb3JpZ2VucykKCmBgYHtyIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTV9CmdyaWQuYXJyYW5nZSh0MSRwbG90LCB0MiRwbG90LAogICAgICAgICAgICAgdDEkbm9ybWFsaWRhZGUsIHQyJG5vcm1hbGlkYWRlLAogICAgICAgICAgICAgdDMkcGxvdCwgdDQkcGxvdCwKICAgICAgICAgICAgIHQzJG5vcm1hbGlkYWRlLCB0NCRub3JtYWxpZGFkZSwKICAgICAgICAgICAgIG5jb2wgPSAyLAogICAgICAgICAgICAgaGVpZ2h0cyA9IGMoMywyLDMsMiksCiAgICAgICAgICAgICB0b3AgPSB0ZXh0R3JvYigiRGVuc2lkYWRlIGRlIGlkZW50aWZpY2HDp8OjbyBtw6lkaWEgZGFzIHR1cm1hcyBlbnRyZSBcbmVzcGVjaWVzIGUgc3VhcyBvcmlnZW5zXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3AgPSBncGFyKGZvbnRzaXplID0gMjAsIGZvbnQgPSAyKSkKICAgICAgICAgICAgICkKYGBgCgojIyMjIEluZGljZSBkZSByZWNvbmhlY2ltZW50byBtw6lkaW8gZGFzIHR1cm1hcwoKYGBge3IgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9M30KZ3JpZC5hcnJhbmdlKHQ1JHBsb3QsIHQ2JHBsb3QsCiAgICAgICAgICAgICB0NSRub3JtYWxpZGFkZSwgdDYkbm9ybWFsaWRhZGUsCiAgICAgICAgICAgICBuY29sID0gMiwKICAgICAgICAgICAgIGhlaWdodHMgPSBjKDQsMyksCiAgICAgICAgICAgICB0b3AgPSB0ZXh0R3JvYigiRGVuc2lkYWRlIGRvcyBpbmRpY2VzIGRlIHJlY29uaGVjaW1lbnRvIG3DqWRpbyBkYXMgdHVybWFzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3AgPSBncGFyKGZvbnRzaXplID0gMjAsIGZvbnQgPSAyKSkKICAgICAgICAgICAgICkKYGBgCgoKIyMjIFEtUSBUZXN0CgpgYGB7ciwgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9NH0KcXFwbG90LmRhdGEgPC0gZnVuY3Rpb24gKHZlYywgdGl0dWxvKSB7CiAgIyBmb2xsb3dpbmcgZm91ciBsaW5lcyBmcm9tIGJhc2UgUidzIHFxbGluZSgpCiAgeSA8LSBxdWFudGlsZSh2ZWNbIWlzLm5hKHZlYyldLCBjKDAuMjUsIDAuNzUpKQogIHggPC0gcW5vcm0oYygwLjI1LCAwLjc1KSkKICBzbG9wZSA8LSBkaWZmKHkpL2RpZmYoeCkKICBpbnQgPC0geVsxTF0gLSBzbG9wZSAqIHhbMUxdCgogIGQgPC0gZGF0YS5mcmFtZShyZXNpZHMgPSB2ZWMpCgogIGdncGxvdChkLCBhZXMoc2FtcGxlID0gcmVzaWRzKSkgKyAKICAgICAgc3RhdF9xcSgpICsgCiAgICAgIGdlb21fYWJsaW5lKHNsb3BlID0gc2xvcGUsIGludGVyY2VwdCA9IGludCwgY29sID0gInJlZCIpICsKICAgICAgeGxpbSgtMiwgMikgKwogICAgICB5bGltKDAsIDEpICsKICAgICAgdGhlbWVfYncoKSArCiAgICAgIGxhYnMoCiAgICAgICAgdGl0bGUgPSB0aXR1bG8KICAgICkKfQoKcTEgPC0gcXFwbG90LmRhdGEocG9zX2dhYmFyaXRvJHByb3BvcmNvZXMkcG9yX3R1cm1hJHBfbmF0aXZhcywgIklkZW50aWZpY2HDp8OjbyBkbyBub21lIGRhcyBlc3DDqWNpZXMgZGUgb3JpZ2VtIE5hdGl2YXMiKQpxMiA8LSBxcXBsb3QuZGF0YShwb3NfZ2FiYXJpdG8kcHJvcG9yY29lcyRwb3JfdHVybWEkcF9leG90aWNhcywgIklkZW50aWZpY2HDp8OjbyBkbyBub21lIGRhcyBlc3DDqWNpZXMgZGUgb3JpZ2VtIEV4b3RpY2FzIikKcTMgPC0gcXFwbG90LmRhdGEocG9zX2dhYmFyaXRvJHByb3BvcmNvZXMkcG9yX3R1cm1hJHBfb3JpZ2VtX25hdGl2YXMsICJJZGVudGlmaWNhw6fDo28gZGUgb3JpZ2VtIE5hdGl2YXMiKQpxNCA8LSBxcXBsb3QuZGF0YShwb3NfZ2FiYXJpdG8kcHJvcG9yY29lcyRwb3JfdHVybWEkcF9vcmlnZW1fZXhvdGljYXMsICJJZGVudGlmaWNhw6fDo28gZGUgb3JpZ2VtIEV4b3RpY2FzIikKcTUgPC0gcXFwbG90LmRhdGEocG9zX2dhYmFyaXRvJHByb3BvcmNvZXMkcG9yX3R1cm1hJHBfaW5kaWNlX25hdGl2YXMsICJJbmRpY2UgZGUgcmVjb25oZWNpbWVudG8gTmF0aXZhcyAob3JpZ2VucyArIGVzcMOpY2llcykiKQpxNiA8LSBxcXBsb3QuZGF0YShwb3NfZ2FiYXJpdG8kcHJvcG9yY29lcyRwb3JfdHVybWEkcF9pbmRpY2VfZXhvdGljYXMsICJJbmRpY2UgZGUgcmVjb25oZWNpbWVudG8gRXhvdGljYXMgKG9yaWdlbnMgKyBlc3DDqWNpZXMpIikKCmdyaWQuYXJyYW5nZShxMSwgcTIsIAogICAgICAgICAgICAgcTMsIHE0LAogICAgICAgICAgICAgcTUsIHE2LAogICAgICAgICAgICAgbmNvbCA9IDIsCiAgICAgICAgICAgICB0b3AgPSB0ZXh0R3JvYigiTm9ybWFsIFEtUSBQbG90XG4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwID0gZ3Bhcihmb250c2l6ZSA9IDIwLCBmb250ID0gMikpCiAgICAgICAgICAgICApCmBgYAoKIyMjIFRlc3RlIGRlIHZhcmnDom5jaWEKClBhcmEgZGV0ZXJtaW5hciBhIHZhcmnDom5jaWEKCmBgYHtyfQp2YXJpYW5jaWEgPC0gZGF0YS5mcmFtZSgKICAgIEFsZ29yaXRtbyA9IGMoIkYgdGVzdCB0byBjb21wYXJlIHR3byB2YXJpYW5jZXMiKSwKICAgICJDb21wYXJhw6fDo28iID0gYygiTmF0aXZhcyB4IEV4w7N0aWNhcyIpLAogICAgIlZhcmnDoXZlbCIgPSBjKAogICAgICAgICJJbmRpY2UgZGUgcmVjb25oZWNpbWVudG8iLAogICAgICAgICJJZGVudGlmaWNhw6fDo28gZG8gbm9tZSBkYXMgZXNww6ljaWVzIiwKICAgICAgICAiSWRlbnRpZmljYcOnw6NvIGRhIG9yaWdlbSIKICAgICksCiAgICAicF92YWxvciIgPSBjKAogICAgICAgIHZhci50ZXN0KHBvc19nYWJhcml0byRwcm9wb3Jjb2VzJHBvcl90dXJtYSRwX2luZGljZV9uYXRpdmFzLCAKICAgICAgICAgICAgICAgICBwb3NfZ2FiYXJpdG8kcHJvcG9yY29lcyRwb3JfdHVybWEkcF9pbmRpY2VfZXhvdGljYXMsIAogICAgICAgICAgICAgICAgIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIpJHAudmFsdWUsCiAgICAgICAgdmFyLnRlc3QocG9zX2dhYmFyaXRvJHByb3BvcmNvZXMkcG9yX3R1cm1hJHBfbmF0aXZhcywgCiAgICAgICAgICAgICAgICAgcG9zX2dhYmFyaXRvJHByb3BvcmNvZXMkcG9yX3R1cm1hJHBfZXhvdGljYXMsIAogICAgICAgICAgICAgICAgIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIpJHAudmFsdWUsCiAgICAgICAgdmFyLnRlc3QocG9zX2dhYmFyaXRvJHByb3BvcmNvZXMkcG9yX3R1cm1hJHBfb3JpZ2VtX25hdGl2YXMsIAogICAgICAgICAgICAgICAgIHBvc19nYWJhcml0byRwcm9wb3Jjb2VzJHBvcl90dXJtYSRwX29yaWdlbV9leG90aWNhcywgCiAgICAgICAgICAgICAgICAgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIikkcC52YWx1ZQogICAgKQopCgp2YXJpYW5jaWEgPC0gdmFyaWFuY2lhICU+JQogICAgbXV0YXRlKAogICAgICAgIHZhcmlhbmNpYSA9IHBfdmFsb3IgPiAwLjA1LAogICAgICAgIHBfdmFsb3IgPSBjZWxsX3NwZWMocm91bmQocF92YWxvciwgNCksIGJvbGQgPSBULCBjb2xvciA9ICJibGFjayIsIGFsaWduID0gInJpZ2h0IiksCiAgICAgICAgdmFyaWFuY2lhID0gY2VsbF9zcGVjKHZhcmlhbmNpYSwgYm9sZCA9IHZhcmlhbmNpYSwKICAgICAgICAgICAgICAgICAgICAgICBjb2xvcj0gaWZlbHNlKHZhcmlhbmNpYSwgIndoaXRlIiwgImJsYWNrIiksIAogICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQgPSBpZmVsc2UodmFyaWFuY2lhLCAiZ3JlZW4iLCAiI0NDQ0NDQyIpKQogICAgKQoKdmFyaWFuY2lhICU+JQogIGthYmxlKGVzY2FwZSA9IEYpICU+JQogIGthYmxlX3N0eWxpbmcoYygic3RyaXBlZCIsICJib3JkZXJlZCIpLCBmdWxsX3dpZHRoID0gVFJVRSkgJT4lCiAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFRSVUUpICU+JQogIGNvbGxhcHNlX3Jvd3MoY29sdW1ucyA9IDE6MiwgdmFsaWduID0gInRvcCIpIApgYGAKCiMjIyBBbmFsaXNlcyBkZXNjcml0aXZhcwoKYGBge3J9CmhlYWQocG9zX2dhYmFyaXRvJGVzcGVjaWVzLCAxMCkKYGBgCgojIyMjIEluZGljZSBkZSBpZGVudGlmaWNhw6fDo28gcG9yIE9yaWdlbQoKYGBge3IsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTR9CnBvc19nYWJhcml0byRlc3BlY2llcyAlPiUgCiAgICBnZ3Bsb3QoYWVzKGVzcGVjaWVEZXNjLCBmciwgZmlsbCA9IGdydXBvKSkgKyAKICAgIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBhc3RlMChyb3VuZChmciAqIDEwMCwgMSksICIlIikpLCAKICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuOSksIHZqdXN0ID0gMC41LAogICAgICAgICAgICAgIGhqdXN0ID0gLTAuNSkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwxLjIpLCBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsKICAgIGZhY2V0X3dyYXAofm9yaWdlbSwgc2NhbGVzID0gImZyZWVfeSIpICsKICAgIGNvb3JkX2ZsaXAoKSArCiAgICB0aGVtZV9idygpICsKICAgIGxhYnModGl0bGUgPSAiSW5kaWNlIGRlIElkZW50aWZpY2HDp8OjbyBwb3IgT3JpZ2VtIiwKICAgICAgICAgZmlsbCA9ICJHcnVwb3MiLCB4ID0gIiIsIHkgPSAiXG5GcmVxdWVuY2lhIHJlbGF0aXZhIikgKwogICAgbXlfdGhlbWUKYGBgCgojIyMjIEluZGljZSBkZSBpZGVudGlmaWNhw6fDo28gcG9yIEVzcMOpY2llCgpgYGB7ciwgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9NH0KcG9zX2dhYmFyaXRvJGVzcGVjaWVzICU+JSAKICAgIGdncGxvdChhZXMoZXNwZWNpZURlc2MsIGZyLCBmaWxsID0gb3JpZ2VtKSkgKyAKICAgIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBhc3RlMChyb3VuZChmciAqIDEwMCwgMSksICIlIikpLCAKICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuOSksIHZqdXN0ID0gMC41LAogICAgICAgICAgICAgIGhqdXN0ID0gLTAuMykgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwxLjIpLCBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsKICAgIGZhY2V0X3dyYXAofmdydXBvLCBzY2FsZXMgPSAiZnJlZV95IikgKwogICAgY29vcmRfZmxpcCgpICsKICAgIHRoZW1lX2J3KCkgKwogICAgbGFicyh0aXRsZSA9ICJJbmRpY2UgZGUgSWRlbnRpZmljYcOnw6NvIHBvciBFc3DDqWNpZSIsCiAgICAgICAgIGZpbGwgPSAiT3JpZ2VtIiwgeCA9ICIiLCB5ID0gIlxuRnJlcXVlbmNpYSByZWxhdGl2YSIpICsKICAgIG15X3RoZW1lCmBgYAoKIyMgVGVzdGVzIGRlIGhpcG90ZXNlcwoKRXNwZXJhZG8gcC12YWxvciA+PSAwLjA1IG5hIG5vcm1hbGlkYWRlIChlc3BlcmEtc2UgSDApCkVzcGVyYWRvIHAtdmFsb3IgPD0gMC4wNSBubyB0ZXN0ZSBkZSBoaXBvdGVzZSAoZXNwZXJhLXNlIEgxKQoKIyMjIDEgLSBPcyBhbHVub3MgaXRlbmRpZmljYW0gbWFpcyBvcyBub21lcyBkb3MgYW5pbWFpcyBkZSBlc3DDqWNpZXMgZXjDs3RpY2FzIHF1ZSBvcyBhbmltYWlzIGRlIGVzcMOpY2llcyBuYXRpdmFzLgoKYGBge3IsIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTN9CnRtcCA8LSBwb3NfZ2FiYXJpdG8kcHJvcG9yY29lcyRwb3JfdHVybWEgJT4lCiAgc2VsZWN0KHR1cm1hcywgcF9ub21lX2V4b3RpY2FzID0gcF9leG90aWNhcywgcF9ub21lX25hdGl2YXMgPSBwX25hdGl2YXMsIHBfb3JpZ2VtX2V4b3RpY2FzOnBfaW5kaWNlX25hdGl2YXMpICU+JQogIG1lbHQoaWQgPSAidHVybWFzIikKCmNiaW5kKHRtcCwgY29sc3BsaXQodG1wJHZhcmlhYmxlLCAiXyIsIGMoInAiLCAiaW5kaWNhZG9yIiwgIm9yaWdlbSIpKSkgJT4lCiAgc2VsZWN0KHR1cm1hcywgaW5kaWNhZG9yLCBvcmlnZW0sIHZhbHVlKSAlPiUKICBnZ3Bsb3QoKSArIAogIGdlb21fYm94cGxvdChhZXMoeCA9IG9yaWdlbSwgeSA9IHZhbHVlLCBmaWxsID0gb3JpZ2VtKSwgc2hvdy5sZWdlbmQgPSBUKSArIAogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsMSksIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKwogIGZhY2V0X3dyYXAofmluZGljYWRvcikgKwogIHRoZW1lX2J3KCkgKwogIGxhYnModGl0bGUgPSAiQm94cGxvdCBkZSBpZGVudGlmaWNhw6fDo28gZG9zIGNyaXTDqXJpb3MgZXN0YWJlbGVjaWRvcyIsCiAgICAgICB5ID0gIlBlcmNlbnR1YWwgZGUgaWRlbnRpZmljYcOnw6NvIiwgeCA9ICIiKSArCiAgbXlfdGhlbWUKYGBgCgpgYGB7cn0KdDEgPC0gdC50ZXN0KAogICAgICAgcG9zX2dhYmFyaXRvJHByb3BvcmNvZXMkcG9yX3R1cm1hJHBfaW5kaWNlX2V4b3RpY2FzLCAKICAgICAgIHBvc19nYWJhcml0byRwcm9wb3Jjb2VzJHBvcl90dXJtYSRwX2luZGljZV9uYXRpdmFzLCAKICAgICAgIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIsIHBhaXJlZCA9IEYsIHZhci5lcXVhbCA9IFQpCnQyIDwtIHQudGVzdCgKICAgICAgIHBvc19nYWJhcml0byRwcm9wb3Jjb2VzJHBvcl90dXJtYSRwX2V4b3RpY2FzLCAKICAgICAgIHBvc19nYWJhcml0byRwcm9wb3Jjb2VzJHBvcl90dXJtYSRwX25hdGl2YXMsIAogICAgICAgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIiwgcGFpcmVkID0gRiwgdmFyLmVxdWFsID0gVCkKdDMgPC0gdC50ZXN0KAogICAgICAgcG9zX2dhYmFyaXRvJHByb3BvcmNvZXMkcG9yX3R1cm1hJHBfb3JpZ2VtX2V4b3RpY2FzLCAKICAgICAgIHBvc19nYWJhcml0byRwcm9wb3Jjb2VzJHBvcl90dXJtYSRwX29yaWdlbV9uYXRpdmFzLCAKICAgICAgIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIsIHBhaXJlZCA9IEYsIHZhci5lcXVhbCA9IFQpCgpkYXRhLmZyYW1lKAogICAgQWxnb3JpdG1vID0gYyh0MSRtZXRob2QsIHQyJG1ldGhvZCwgdDMkbWV0aG9kKSwKICAgICJDb21wYXJhw6fDo28iID0gYygiRXjDs3RpY2FzIHggTmF0aXZhcyIpLAogICAgIlZhcmnDoXZlbCIgPSBjKAogICAgICAgICJJbmRpY2UgZGUgcmVjb25oZWNpbWVudG8iLAogICAgICAgICJJZGVudGlmaWNhw6fDo28gZG8gbm9tZSBkYXMgZXNww6ljaWVzIiwKICAgICAgICAiSWRlbnRpZmljYcOnw6NvIGRhIG9yaWdlbSIKICAgICksCiAgICBwX3ZhbG9yID0gYyh0MSRwLnZhbHVlLCB0MiRwLnZhbHVlLCB0MyRwLnZhbHVlKSwKICAgIEgwID0gYyh0MSRwLnZhbHVlID49IDAuMDUsIHQyJHAudmFsdWUgPj0gMC4wNSwgdDMkcC52YWx1ZSA+PSAwLjA1KSwKICAgIEgxID0gYyh0MSRwLnZhbHVlIDwgMC4wNSwgdDIkcC52YWx1ZSA8IDAuMDUsIHQzJHAudmFsdWUgPCAwLjA1KSwKICAgICJDb25maWFuw6dhIiA9IGMoCiAgICAgICAgcGFzdGUocGFzdGUwKHJvdW5kKHQxJGNvbmYuaW50ICogMTAwLCAyKSwgIiUiKSwgY29sbGFwc2UgPSAiIH4gIiksCiAgICAgICAgcGFzdGUocGFzdGUwKHJvdW5kKHQyJGNvbmYuaW50ICogMTAwLCAyKSwgIiUiKSwgY29sbGFwc2UgPSAiIH4gIiksCiAgICAgICAgcGFzdGUocGFzdGUwKHJvdW5kKHQzJGNvbmYuaW50ICogMTAwLCAyKSwgIiUiKSwgY29sbGFwc2UgPSAiIH4gIikKICAgICkKKSAlPiUKICBtdXRhdGUoCiAgICBwX3ZhbG9yID0gY2VsbF9zcGVjKHBfdmFsb3IsIGJvbGQgPSBULCBjb2xvciA9ICJibGFjayIsIGFsaWduID0gInJpZ2h0IiksCiAgICBIMCA9IGNlbGxfc3BlYyhIMCwgYm9sZCA9IEgwLAogICAgICAgICAgICAgICAgICAgY29sb3I9IGlmZWxzZShIMCwgIndoaXRlIiwgImJsYWNrIiksIAogICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZCA9IGlmZWxzZShIMCwgImdyZWVuIiwgIiNDQ0NDQ0MiKSksCiAgICBIMSA9IGNlbGxfc3BlYyhIMSwgYm9sZCA9IEgxLCAKICAgICAgICAgICAgICAgICAgIGNvbG9yID0gaWZlbHNlKEgxLCAid2hpdGUiLCAiYmxhY2siKSwgCiAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kID0gaWZlbHNlKEgxLCAiZ3JlZW4iLCAiI0NDQ0NDQyIpKQogICkgJT4lCiAga2FibGUoZXNjYXBlID0gRikgJT4lCiAga2FibGVfc3R5bGluZyhjKCJzdHJpcGVkIiwgImJvcmRlcmVkIiksIGZ1bGxfd2lkdGggPSBUUlVFKSAlPiUKICBjb2x1bW5fc3BlYygxLCBib2xkID0gVFJVRSkgJT4lCiMgIGNvbHVtbl9zcGVjKDQsIGJvbGQgPSBULCBjb2xvciA9ICJkYXJrYmx1ZSIpICU+JQogIGNvbGxhcHNlX3Jvd3MoY29sdW1ucyA9IDE6MiwgdmFsaWduID0gInRvcCIpICU+JQogIGZvb3Rub3RlKGdlbmVyYWwgPSAiSW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgOTUlIiwKICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIlxuT2JzLjogIiwKICAgICAgICAgICBmb290bm90ZV9hc19jaHVuayA9IFQpCmBgYAoKCiMjIyAyIC0gT3MgYWx1bm9zIGlkZW50aWZpY2FtIG1haXMgZXNww6ljaWVzIGRlIG9yaWdlbSBleMOzdGljYSBxdWUgYXMgZGUgb3JpZ2VtIG5hdGl2YS4KCmBgYHtyfQp0LnRlc3QocG9zX2dhYmFyaXRvJHByb3BvcmNvZXMkcG9yX3R1cm1hJHBfb3JpZ2VtX25hdGl2YXMsIAogICAgICAgcG9zX2dhYmFyaXRvJHByb3BvcmNvZXMkcG9yX3R1cm1hJHBfb3JpZ2VtX2V4b3RpY2FzLCAKICAgICAgIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIsIHBhaXJlZCA9IEYsIHZhci5lcXVhbCA9IFQpCmBgYAoKIyMjIDMgLSBPcyBhbHVub3MgaWRlbnRpZmljYW0gbWFpcyBhcyBlc3DDqWNpZXMgZXjDs3RpY2FzIChub21lIGRvcyBhbmltYWlzIGUgb3JpZ2VtKSBxdWUgZXNww6ljaWVzIG5hdGl2YXMuCgoqKkFOT1ZBKiogIAoKIyMjIDQgLSBPcyBhbHVub3MgcmVjb25oZWNlbSBtYWlzIG1hbcOtZmVyb3MgZG8gcXVlIG9zIGRlbWFpcyBncnVwb3MgdGF4b27Ds21pY29zLgoKYGBge3IsIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTN9CnBvc19nYWJhcml0byR0YXhvbm9taWNvcyAlPiUKICAgIGdncGxvdCgpICsgCiAgICBnZW9tX2JveHBsb3QoYWVzKHggPSBncnVwbywgeSA9IHZhbHVlLCBmaWxsID0gb3JpZ2VtKSwgc2hvdy5sZWdlbmQgPSBUKSArIAogICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwxKSwgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArCiAgICB0aGVtZV9idygpICsKICAgIGxhYnModGl0bGUgPSAiQm94cGxvdCBkZSBpZGVudGlmaWNhw6fDo28gZGUgZXNww6ljaWVzIHBvciBncnVwbyB0YXhvbsO0bWljbyIsCiAgICAgICAgIHkgPSAiUGVyY2VudHVhbCBkZSBpZGVudGlmaWNhw6fDo28iLCB4ID0gIiIpICsKICAgIG15X3RoZW1lCmBgYAoKYGBge3IsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTV9CiMgUmVhbGl6YW5kbyBBbm92YSBmYXRvcmlhbAphbm92YShsbSh2YWx1ZSB+IGdydXBvICogb3JpZ2VtLCBwb3NfZ2FiYXJpdG8kdGF4b25vbWljb3MpKQpUdWtleUhTRChhb3YobG0odmFsdWUgfiBncnVwbyAqIG9yaWdlbSwgcG9zX2dhYmFyaXRvJHRheG9ub21pY29zKSkpCmBgYAoKIyMjIDUgLSBFc3R1ZGFudGVzIHF1ZSByZXNpZGVtIG5hIENpZGFkZSAxIChjb20gVUMpIGlkZW50aWZpY2FtIG1haXMgZXNww6ljaWVzIG5hdGl2YXMgZG8gcXVlIGVzdHVkYW50ZXMgcXVlIHJlc2lkZW0gbmEgQ2lkYWRlIDIgKHNlbSBVQykuCgpgYGB7ciwgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9M30KdG1wIDwtCiAgICBtZXJnZSgKICAgICAgICBwb3NfZ2FiYXJpdG8kZGFkb3MgJT4lIAogICAgICAgICAgICBzZWxlY3QodHVybWFzLCBtdW5pY2lwaW8pICU+JSAKICAgICAgICAgICAgdW5pcXVlKCksCiAgICAgICAgcG9zX2dhYmFyaXRvJHByb3BvcmNvZXMkcG9yX3R1cm1hX2FyZWEKICAgICkgJT4lCiAgICBzZWxlY3QobXVuaWNpcGlvLCBhcmVhLCB2YWx1ZSA9IHBfbmF0aXZhcykgJT4lCiAgICB0YmxfZGYoKQoKIyBSZWFsaXphbmRvIG8gdGVzdGUgVAp0LnRlc3QodmFsdWUgfiBtdW5pY2lwaW8sIHRtcCkKYGBgCgpgYGB7ciwgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9M30KdG1wICU+JQogIGdncGxvdCgpICsgCiAgZ2VvbV9ib3hwbG90KGFlcyh4ID0gYXJlYSwgeSA9IHZhbHVlLCBmaWxsID0gbXVuaWNpcGlvKSwgc2hvdy5sZWdlbmQgPSBUKSArIAogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsMSksIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKwogIGZhY2V0X3dyYXAofm11bmljaXBpbykgKwogIHRoZW1lX2J3KCkgKwogIGxhYnModGl0bGUgPSAiQm94cGxvdCBkZSBpZGVudGlmaWNhw6fDo28gZGUgZXNww6ljaWVzIE5hdGl2YXMgbm9zIGNyaXTDqXJpb3MgZXN0YWJlbGVjaWRvcyIsCiAgICAgICB5ID0gIlBlcmNlbnR1YWwgZGUgaWRlbnRpZmljYcOnw6NvIiwgeCA9ICIiKSArCiAgbXlfdGhlbWUKCmBgYAoKIyMjIDYgLSBFc3R1ZGFudGVzIHF1ZSByZXNpZGVtIGVtIMOhcmVhIHJ1cmFsIHRlbSBtYWlvciBjb25oZWNpbWVudG8gc29icmUgYXMgZXNww6ljaWVzIG5hdGl2YXMuCgpgYGB7ciwgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9M30KdG1wIDwtIAogICAgcG9zX2dhYmFyaXRvJHByb3BvcmNvZXMkcG9yX3R1cm1hX2FyZWEgJT4lCiAgICBzZWxlY3QobXVuaWNpcGlvLCBhcmVhLCBwX25vbWVfbmF0aXZhcyA9IHBfbmF0aXZhcywgcF9vcmlnZW1fbmF0aXZhcywgcF9pbmRpY2VfbmF0aXZhcykgJT4lCiAgICBhcnJhbmdlKGFyZWEpICU+JQogICAgbWVsdChpZCA9IGMoIm11bmljaXBpbyIsICJhcmVhIikpCgp0bXAgPC0KICAgIGNiaW5kKHRtcCwgY29sc3BsaXQodG1wJHZhcmlhYmxlLCAiXyIsIGMoInAiLCAiaW5kaWNhZG9yIiwgIm9yaWdlbSIpKSkgJT4lCiAgICBzZWxlY3QobXVuaWNpcGlvLCBhcmVhLCBpbmRpY2Fkb3IsIG9yaWdlbSwgdmFsdWUpCgp0bXAgJT4lCiAgZ2dwbG90KCkgKyAKICBnZW9tX2JveHBsb3QoYWVzKHggPSBhcmVhLCB5ID0gdmFsdWUsIGZpbGwgPSBtdW5pY2lwaW8pLCBzaG93LmxlZ2VuZCA9IFQpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwxKSwgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArCiAgZmFjZXRfd3JhcCh+aW5kaWNhZG9yKSArCiAgdGhlbWVfYncoKSArCiAgbGFicyh0aXRsZSA9ICJCb3hwbG90IGRlIGlkZW50aWZpY2HDp8OjbyBkZSBlc3DDqWNpZXMgTmF0aXZhcyBub3MgY3JpdMOpcmlvcyBlc3RhYmVsZWNpZG9zIiwKICAgICAgIHkgPSAiUGVyY2VudHVhbCBkZSBpZGVudGlmaWNhw6fDo28iLCB4ID0gIiIpICsKICBteV90aGVtZQpgYGAKCmBgYHtyfQojYm94cGxvdCh2YWx1ZSAgfiBtdW5pY2lwaW8gKyBhcmVhLCBkYXRhID0gdG1wKQojIGludGVyYWN0aW9uLnBsb3QodG1wJGFyZWEsIHRtcCRtdW5pY2lwaW8sIHRtcCR2YWx1ZSkKIyBpbnRlcmFjdGlvbi5wbG90KHRtcCRtdW5pY2lwaW8sIHRtcCRhcmVhLCB0bXAkdmFsdWUpCiMgYWdncmVnYXRlKHZhbHVlIH4gYXJlYSAqIG11bmljaXBpbywgZGF0YSA9IHRtcCwgRlVOID0gZnVuY3Rpb24oeCkgc2hhcGlyby50ZXN0KHgpJHAudmFsdWUpCiMgdG1wJGJhcnQgPSBwYXN0ZSh0bXAkbXVuaWNpcGlvLCAiLSIsIHRtcCRhcmVhKQojIGJhcnRsZXR0LnRlc3QodmFsdWUgfiBiYXJ0LCBkYXRhID0gdG1wKQoKdC5hbm92YSA8LSBhbm92YShsbSh2YWx1ZSAgfiBtdW5pY2lwaW8gKiBhcmVhLCBkYXRhID0gdG1wICU+JSBmaWx0ZXIoaW5kaWNhZG9yID09ICJpbmRpY2UiKSkpCnQuYW5vdmEgJT4lCiAgICBrYWJsZSgpICU+JQogICAga2FibGVfc3R5bGluZyhjKCJzdHJpcGVkIiwgImJvcmRlcmVkIiksIGZ1bGxfd2lkdGggPSBUUlVFKSAlPiUKICAgIGNvbHVtbl9zcGVjKDEsIGJvbGQgPSBUUlVFKQoKdHVrZXkgPC0gVHVrZXlIU0QoYW92KGxtKHZhbHVlICB+IG11bmljaXBpbyAqIGFyZWEsIGRhdGEgPSB0bXAgJT4lIGZpbHRlcihpbmRpY2Fkb3IgPT0gImluZGljZSIpKSkpCnR1a2V5CiNwbG90KHR1a2V5KQoKdGsgPC0gYXMuZGF0YS5mcmFtZSh0dWtleSRgbXVuaWNpcGlvOmFyZWFgKQp0ayRjb21wYXJhY2FvID0gcm93bmFtZXModGspCnJvd25hbWVzKHRrKSA9IE5VTEwKdGsgJT4lCiAgICBzZWxlY3QoY29tcGFyYWNhbywgZGlmZjpgcCBhZGpgKSAlPiUKICAgIG11dGF0ZShzaWduaWZpY2FuY2lhID0gYHAgYWRqYCA8PSAwLjA1KSAlPiUKICAgIGthYmxlKCkgJT4lCiAgICBrYWJsZV9zdHlsaW5nKGMoInN0cmlwZWQiLCAiYm9yZGVyZWQiKSwgZnVsbF93aWR0aCA9IFRSVUUpICU+JQogICAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFRSVUUpCgpgYGAKCiMjIyA3IC0gCgojIyMgOCAtIEZyZXF1ZW5jaWEgZGUgY29udGF0byBuYXR1cmV6YQoKYGBge3IsIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTN9CnRtcCA8LSAKICAgIHBvc19nYWJhcml0byRwcm9wb3Jjb2VzJHBvcl90dXJtYV9mcmVxX2NvbnRhdG8gJT4lCiAgICBzZWxlY3QoZnJlcXVlbmNpYSwgcF9ub21lX25hdGl2YXMgPSBwX25hdGl2YXMsIHBfb3JpZ2VtX25hdGl2YXMsIHBfaW5kaWNlX25hdGl2YXMpICU+JQogICAgYXJyYW5nZShmcmVxdWVuY2lhKSAlPiUKICAgIG1lbHQoaWQgPSAiZnJlcXVlbmNpYSIpCgp0bXAgPC0KICAgIGNiaW5kKHRtcCwgY29sc3BsaXQodG1wJHZhcmlhYmxlLCAiXyIsIGMoInAiLCAiaW5kaWNhZG9yIiwgIm9yaWdlbSIpKSkgJT4lCiAgICBzZWxlY3QoZnJlcXVlbmNpYSwgaW5kaWNhZG9yLCBvcmlnZW0sIHZhbHVlKQoKdG1wICU+JQogIGdncGxvdCgpICsgCiAgZ2VvbV9ib3hwbG90KGFlcyh4ID0gZnJlcXVlbmNpYSwgeSA9IHZhbHVlLCBmaWxsID0gZnJlcXVlbmNpYSksIHNob3cubGVnZW5kID0gVCkgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDEpLCBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsKICBmYWNldF93cmFwKH5pbmRpY2Fkb3IpICsKICB0aGVtZV9idygpICsKICBsYWJzKHRpdGxlID0gIkJveHBsb3QgZGUgaWRlbnRpZmljYcOnw6NvIGRlIGVzcMOpY2llcyBOYXRpdmFzIG5vcyBjcml0w6lyaW9zIGVzdGFiZWxlY2lkb3MiLAogICAgICAgeSA9ICJQZXJjZW50dWFsIGRlIGlkZW50aWZpY2HDp8OjbyIsIHggPSAiIikgKwogIG15X3RoZW1lCmBgYAoKYGBge3J9CiMgYWdncmVnYXRlKHZhbHVlIH4gZnJlcXVlbmNpYSwgCiMgICAgICAgICAgIGRhdGEgPSB0bXAgJT4lIGZpbHRlcihpbmRpY2Fkb3IgPT0gImluZGljZSIpLCAKIyAgICAgICAgICAgRlVOID0gZnVuY3Rpb24oeCkgc2hhcGlyby50ZXN0KHgpJHAudmFsdWUpCgp0LmFub3ZhIDwtIGFub3ZhKGxtKHZhbHVlICB+IGZyZXF1ZW5jaWEsIGRhdGEgPSB0bXAgJT4lIGZpbHRlcihpbmRpY2Fkb3IgPT0gImluZGljZSIpKSkKdC5hbm92YSAlPiUKICAgIGthYmxlKCkgJT4lCiAgICBrYWJsZV9zdHlsaW5nKGMoInN0cmlwZWQiLCAiYm9yZGVyZWQiKSwgZnVsbF93aWR0aCA9IFRSVUUpICU+JQogICAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFRSVUUpCgp0dWtleSA8LSBUdWtleUhTRChhb3YobG0odmFsdWUgIH4gZnJlcXVlbmNpYSwgZGF0YSA9IHRtcCAlPiUgZmlsdGVyKGluZGljYWRvciA9PSAiaW5kaWNlIikpKSkKdHVrZXkKI3Bsb3QodHVrZXkpCgp0ayA8LSBhcy5kYXRhLmZyYW1lKHR1a2V5JGZyZXF1ZW5jaWEpCnRrJGNvbXBhcmFjYW8gPSByb3duYW1lcyh0aykKcm93bmFtZXModGspID0gTlVMTAp0ayAlPiUKICAgIHNlbGVjdChjb21wYXJhY2FvLCBkaWZmOmBwIGFkamApICU+JQogICAgbXV0YXRlKHNpZ25pZmljYW5jaWEgPSBgcCBhZGpgIDw9IDAuMDUpICU+JQogICAga2FibGUoKSAlPiUKICAgIGthYmxlX3N0eWxpbmcoYygic3RyaXBlZCIsICJib3JkZXJlZCIpLCBmdWxsX3dpZHRoID0gVFJVRSkgJT4lCiAgICBjb2x1bW5fc3BlYygxLCBib2xkID0gVFJVRSkKCmBgYAoKIyMjIDkgLSBGZXogYXVsYXMgcHJhdGljYXMKCmBgYHtyLCBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD0zfQp0bXAgPC0gCiAgICBwb3NfZ2FiYXJpdG8kcHJvcG9yY29lcyRwb3JfdHVybWFfZmV6X2F1bGEgJT4lCiAgICBzZWxlY3QoZmV6LmF1bGEsIHBfbm9tZV9uYXRpdmFzID0gcF9uYXRpdmFzLCBwX29yaWdlbV9uYXRpdmFzLCBwX2luZGljZV9uYXRpdmFzKSAlPiUKICAgIGFycmFuZ2UoZmV6LmF1bGEpICU+JQogICAgbWVsdChpZCA9ICJmZXouYXVsYSIpCgp0bXAgPC0gY2JpbmQodG1wLCBjb2xzcGxpdCh0bXAkdmFyaWFibGUsICJfIiwgYygicCIsICJpbmRpY2Fkb3IiLCAib3JpZ2VtIikpKSAlPiUKICBzZWxlY3QoZmV6LmF1bGEsIGluZGljYWRvciwgb3JpZ2VtLCB2YWx1ZSkgCgp0bXAgJT4lCiAgZ2dwbG90KCkgKyAKICBnZW9tX2JveHBsb3QoYWVzKHggPSBmZXouYXVsYSwgeSA9IHZhbHVlLCBmaWxsID0gZmV6LmF1bGEpLCBzaG93LmxlZ2VuZCA9IFQpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwxKSwgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArCiAgZmFjZXRfd3JhcCh+aW5kaWNhZG9yKSArCiAgdGhlbWVfYncoKSArCiAgbGFicyh0aXRsZSA9ICJCb3hwbG90IGRlIGlkZW50aWZpY2HDp8OjbyBkZSBlc3DDqWNpZXMgTmF0aXZhcyBub3MgY3JpdMOpcmlvcyBlc3RhYmVsZWNpZG9zIC0gQWx1bm9zIHF1ZSBmaXplcmFtIGF1bGEiLAogICAgICAgeSA9ICJQZXJjZW50dWFsIGRlIGlkZW50aWZpY2HDp8OjbyIsIHggPSAiIikgKwogIG15X3RoZW1lCmBgYAoKYGBge3J9CmFub3ZhX2Zlei5hdWxhIDwtIHRlc3RlLmFub3ZhKGZvcm11bGEgPSB2YWx1ZSB+IGZlei5hdWxhLCAKICAgICAgICAgICAgZGF0YSA9IHRtcCAlPiUgZmlsdGVyKGluZGljYWRvciA9PSAiaW5kaWNlIikpCgphbm92YV9mZXouYXVsYSR0ZXN0ZS5ub3JtYWxpZGFkZQphbm92YV9mZXouYXVsYSR0ZXN0ZS5hbm92YQphbm92YV9mZXouYXVsYSR0YWJlbGEudHVrZXkKYGBgCgoKIyMjIDEwIC0gRXN0dWRhbnRlcyBkYSBDaWRhZGUgMSAoY29tIFVDKSB0ZW0gbWFpb3IgbsO6bWVybyBkZSBhY2VydG9zIGRlIGVzcMOpY2llcyBuYXRpdmFzLgoKYGBge3IsIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTN9CnRtcCA8LSAKICAgIHBvc19nYWJhcml0byRwcm9wb3Jjb2VzJHBvcl90dXJtYV9mbG9uYSAlPiUKICAgIHNlbGVjdChmbG9uYSwgcF9ub21lX25hdGl2YXMgPSBwX25hdGl2YXMsIHBfb3JpZ2VtX25hdGl2YXMsIHBfaW5kaWNlX25hdGl2YXMpICU+JQogICAgYXJyYW5nZShmbG9uYSkgJT4lCiAgICBtZWx0KGlkID0gImZsb25hIikKCnRtcCA8LSBjYmluZCh0bXAsIGNvbHNwbGl0KHRtcCR2YXJpYWJsZSwgIl8iLCBjKCJwIiwgImluZGljYWRvciIsICJvcmlnZW0iKSkpICU+JQogIHNlbGVjdChmbG9uYSwgaW5kaWNhZG9yLCBvcmlnZW0sIHZhbHVlKSAKCnRtcCAlPiUKICBnZ3Bsb3QoKSArIAogIGdlb21fYm94cGxvdChhZXMoeCA9IGZsb25hLCB5ID0gdmFsdWUsIGZpbGwgPSBmbG9uYSksIHNob3cubGVnZW5kID0gVCkgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDEpLCBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsKICBmYWNldF93cmFwKH5pbmRpY2Fkb3IpICsKICB0aGVtZV9idygpICsKICBsYWJzKHRpdGxlID0gIkJveHBsb3QgZGUgaWRlbnRpZmljYcOnw6NvIGRlIGVzcMOpY2llcyBOYXRpdmFzIG5vcyBjcml0w6lyaW9zIGVzdGFiZWxlY2lkb3MgLSBBbHVub3MgcXVlIHZpc2l0YXJhbSBhIEZsb25hIiwKICAgICAgIHkgPSAiUGVyY2VudHVhbCBkZSBpZGVudGlmaWNhw6fDo28iLCB4ID0gIiIpICsKICBteV90aGVtZQpgYGAKCmBgYHtyfQphbm92YV9mbG9uYSA8LSB0ZXN0ZS5hbm92YShmb3JtdWxhID0gdmFsdWUgfiBmbG9uYSwgCiAgICAgICAgICAgIGRhdGEgPSB0bXAgJT4lIGZpbHRlcihpbmRpY2Fkb3IgPT0gImluZGljZSIpKQoKYW5vdmFfZmxvbmEkdGVzdGUubm9ybWFsaWRhZGUKYW5vdmFfZmxvbmEkdGVzdGUuYW5vdmEKYW5vdmFfZmxvbmEkdGFiZWxhLnR1a2V5CmBgYAoKIyMjIDExIC0gUmFua2luZyBkb3MgYW5pbWFpcwoKYGBge3IsIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTR9CmExIDwtIAogICAgcG9zX2dhYmFyaXRvJHJha2luZ19hbmltYWlzJG5hdGl2b3MgJT4lCiAgICBoZWFkKDIwKSAlPiUKICAgIGdncGxvdChhZXMoeCA9IGFuaW1haXMsIHkgPSBmcmVxLCBmaWxsID0gZnJlcSkpICsKICAgIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5Iiwgc2hvdy5sZWdlbmQgPSBGKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gZnJlcSksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMC45KSwgdmp1c3QgPSAtMSwgaGp1c3QgPSAwLjUpICsKICAgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsOTApKSArCiAgICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9ICJvcmFuZ2UiLCBoaWdoID0gInJlZCIpICsKICAgIHRoZW1lX2J3KCkgKwogICAgbGFicyh0aXRsZSA9ICJFc3DDqWNpZXMgY2l0YWRhcyBjb21vIG5hdGl2YXMiLAogICAgICAgeSA9ICJGcmVxdWVuY2lhIiwgeCA9ICIiKSArCiAgICBteV90aGVtZQphMiA8LSAKICAgIHBvc19nYWJhcml0byRyYWtpbmdfYW5pbWFpcyRleG90aWNvcyAlPiUKICAgIGhlYWQoMjApICU+JQogICAgZ2dwbG90KGFlcyh4ID0gYW5pbWFpcywgeSA9IGZyZXEsIGZpbGwgPSBmcmVxKSkgKwogICAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBzaG93LmxlZ2VuZCA9IEYpICsKICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBmcmVxKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjkpLCB2anVzdCA9IC0xLCBoanVzdCA9IDAuNSkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCw5MCkpICsKICAgIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gImxpZ2h0Ymx1ZSIsIGhpZ2ggPSAiZGFya2JsdWUiKSArCiAgICB0aGVtZV9idygpICsKICAgIGxhYnModGl0bGUgPSAiRXNww6ljaWVzIGNpdGFkYXMgY29tbyBleMOzdGljYXMiLAogICAgICAgeSA9ICJGcmVxdWVuY2lhIiwgeCA9ICIiKSArCiAgICBteV90aGVtZQoKZ3JpZC5hcnJhbmdlKGExLCBhMiwKICAgICAgICAgICAgIG5yb3cgPSAyLAogICAgICAgICAgICAgdG9wID0gdGV4dEdyb2IoIlRPUCAyMCAtIFJhbmtpbmcgZGFzIGVzcMOpY2llcyBjaXRhZGFzIGNvbW8gZXhlbXBsb1xuIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncCA9IGdwYXIoZm9udHNpemUgPSAyMCwgZm9udCA9IDIpKQopCmBgYAoKIyMjIDEzIC0gUmFua2luZyBkb3MgYW5pbWFpcyBjaXRhZG9zIHBhcmEgcHJvdGXDp8OjbwoKYGBge3IsIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTJ9CmEzIDwtIAogICAgcG9zX2dhYmFyaXRvJHJha2luZ19hbmltYWlzJHByb3RlZ2lkb3MgJT4lCiAgICBoZWFkKDIwKSAlPiUKICAgIGdncGxvdChhZXMoeCA9IGFuaW1haXMsIHkgPSBmcmVxLCBmaWxsID0gZnJlcSkpICsKICAgIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5Iiwgc2hvdy5sZWdlbmQgPSBGKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gZnJlcSksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMC45KSwgdmp1c3QgPSAtMSwgaGp1c3QgPSAwLjUpICsKICAgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsMTkwKSkgKwogICAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAiZ3JlZW4iLCBoaWdoID0gImRhcmtncmVlbiIpICsKICAgIHRoZW1lX2J3KCkgKwogICAgbGFicyh0aXRsZSA9ICJFc3DDqWNpZXMgY2l0YWRhcyBjb21vIG5hdGl2YXMiLAogICAgICAgeSA9ICJGcmVxdWVuY2lhIiwgeCA9ICIiKSArCiAgICBteV90aGVtZQoKZ3JpZC5hcnJhbmdlKGEzLAogICAgICAgICAgICAgdG9wID0gdGV4dEdyb2IoIlRPUCAyMCAtIFJhbmtpbmcgZGFzIGVzcMOpY2llcyBjaXRhZGFzIGNvbW8gZXhlbXBsbyBwYXJhIHByb3Rlw6fDo29cbiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3AgPSBncGFyKGZvbnRzaXplID0gMjAsIGZvbnQgPSAyKSkKKQpgYGAKCmBgYHtyLCBlY2hvPUZBTFNFfQojIyBBbm92YSBwb3IgZ3J1cG8gZGUgZXNww6ljaWVzCgojIGZvcihncnAgaW4gdW5pcXVlKHBvc19nYWJhcml0byRlc3BlY2llJGdydXBvKSkgewojICAgICBtZXNzYWdlKGdycCkKIyAgICAgCiMgICAgIFR1a2V5SFNEKGFvdihsbShhY2VydG9zIH4gZXNwZWNpZSArIGdydXBvLCB0YmxfZXNwZWNpZXMxKSkpCiMgICAgIGRhZG9zIDwtIAojICAgICAgICAgcG9zX2dhYmFyaXRvJGVzcGVjaWVzQnJ1dG8gJT4lIAojICAgICAgICAgZmlsdGVyKGdydXBvID09IGdycCkgJT4lIAojICAgICAgICAgbXV0YXRlKHZhbHVlID0gZnIsIGVzcGVjaWUgPSBmYWN0b3IoZXNwZWNpZSkpCiMgICAgICNwcmludChkYWRvcykKIyAgICAgI2FnZ3JlZ2F0ZSh2YWx1ZSB+IGdydXBvLCBkYWRvcywgIEZVTiA9IGZ1bmN0aW9uKHgpIHNoYXBpcm8udGVzdCh4KSRwLnZhbHVlKQojICAgICAKIyAgICAgc2hhcGlyby50ZXN0KGRhZG9zJGZyKQojICAgICBhbm92YShsbShmciB+IGVzcGVjaWUsIGRhZG9zKSkKIyAgICAgVHVrZXlIU0QoYW92KGxtKGZyIH4gZXNwZWNpZSwgZGFkb3MpKSkKIyB9CmBgYAoK